/**
 * 全局事件总线
 * 用于组件间通信，特别是用户信息更新的同步
 */

class EventBus {
  constructor() {
    this.events = {}
  }

  /**
   * 监听事件
   * @param {string} eventName - 事件名称
   * @param {function} callback - 回调函数
   */
  on(eventName, callback) {
    if (!this.events[eventName]) {
      this.events[eventName] = []
    }
    this.events[eventName].push(callback)
  }

  /**
   * 移除事件监听
   * @param {string} eventName - 事件名称
   * @param {function} callback - 回调函数
   */
  off(eventName, callback) {
    if (!this.events[eventName]) return
    
    const index = this.events[eventName].indexOf(callback)
    if (index > -1) {
      this.events[eventName].splice(index, 1)
    }
  }

  /**
   * 触发事件
   * @param {string} eventName - 事件名称
   * @param {any} data - 传递的数据
   */
  emit(eventName, data) {
    if (!this.events[eventName]) return
    
    this.events[eventName].forEach(callback => {
      try {
        callback(data)
      } catch (error) {
        console.error(`Event callback error for ${eventName}:`, error)
      }
    })
  }

  /**
   * 只监听一次事件
   * @param {string} eventName - 事件名称
   * @param {function} callback - 回调函数
   */
  once(eventName, callback) {
    const onceCallback = (data) => {
      callback(data)
      this.off(eventName, onceCallback)
    }
    this.on(eventName, onceCallback)
  }

  /**
   * 清除所有事件监听
   */
  clear() {
    this.events = {}
  }

  /**
   * 清除指定事件的所有监听
   * @param {string} eventName - 事件名称
   */
  clearEvent(eventName) {
    delete this.events[eventName]
  }
}

// 创建全局事件总线实例
const eventBus = new EventBus()

// 定义常用的事件名称常量
export const EVENT_NAMES = {
  USER_PROFILE_UPDATED: 'user-profile-updated',
  USER_LIST_REFRESH: 'user-list-refresh',
  USER_INFO_CHANGED: 'user-info-changed'
}

export default eventBus
